#ifndef _COMM_
#define _COMM_
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define PATH_NAME "/home/LDCWD"
#define PROJECT_ID 0555
#define FTOK_ERR 1
#define CREAT_ERR 2
#define SHMSIZE 4096
#define SHMDT_ERR 3
#define GETSHM_ERR 4
#define SHM_ERR 5
#define MKFIFO_ERR 6
#define UNLINK_ERR 7
#define OPEN_ERR 8
#define MODE 0666
#define FIFOFILE_NAME "myfifo"
#include "log.hpp"
Log log;
key_t getKey()
{
  key_t key=ftok(PATH_NAME,PROJECT_ID);
  if(key<0)
  {
   log(FATAL,"Getkey fail! error message:%s  error code: %d",strerror(errno),errno);
   exit(FTOK_ERR);
  }
   log(DEBUG,"Getsuccess ! error message:%s  error code: %d",strerror(errno),errno);
   return key;
}
int GetSHMHelper(int flag)
{
   key_t key=getKey();//第一步获取key
   int shmid=shmget(key,SHMSIZE,flag);//第二步用key创建或获取共享内存
   if(shmid<0)
   {
   log(FATAL,"GetSHM  error!!! message:%s  error code: %d",strerror(errno),errno);
      exit(SHM_ERR);
   }
   return shmid;
}
int CreatShm()
{
   return GetSHMHelper(IPC_CREAT|IPC_EXCL|0666);//申请的内存大小一般为4096的整数倍
   //如果创建的共享内存存在就出错返回，如果不存在就创建，确保共享内存一定是新的
}
int GetShm()
{
   return GetSHMHelper(IPC_CREAT);//不存在就创建，存在就获取并返回
}
class Init
{
    public:
    Init()
    {
            //创建命名管道
    int retmkfifo=mkfifo(FIFOFILE_NAME,MODE);
    if(retmkfifo==-1)
    {
        perror("mkfifo");
        exit(MKFIFO_ERR);
    }
    }
    ~Init()
    {
            //删除管道文件
    int retunlink=unlink(FIFOFILE_NAME);
    if(retunlink==-1)
    {
        perror("unlink");
        exit(UNLINK_ERR);
    }
    }
};
#endif